#include "msg.h"
#include "../config.h"

void * robot_malloc(int size,int reset){
        void * m = malloc(size);
        if(reset){ 
                 memset(m,0,size);
        }
        return m;
}


void printfmsg(char* msg,int len)
{
	int i =0;
	printf("msg len:%d,msg content:\n",len);
	while(i<len)
	{
		if(i<4)
			printf("%d ",msg[i]);
		else
			printf("%c ",msg[i]);
		i++;
	}
	printf("\n");

}


int serialize_msg(msg_base* msg , char** out_msg , int* out_len)
{
	char* msg_ = NULL;
	int len = 0;
	if(!msg){
		dbg_info("serialize_msg:null msg");
		return MSG_ERROR_NULL_MSG;
	}
	len = msg->len;

	msg_ = robot_malloc((len+MSG_HEAD_LEN)*sizeof(char),true);
	SET_MSG_HEAD(msg_);
	SET_MSG_TYPE(msg_,msg->type);
	SET_MSG_LEN (msg_,len);
	
	memcpy(msg_+MSG_HEAD_LEN,msg->data,msg->len);	
	*out_msg = msg_;
	*out_len = len+MSG_HEAD_LEN;
	return 0;
}



int deserialize_msg(char* msg , int len , msg_base** out_msg)
{
	msg_base * msg_;
        int datalen = 0;
	if(!msg || len<=0 ){
		dbg_info("deserialize_msg:null msg");
		return MSG_ERROR_NULL_MSG;
	}
	
	if(!IS_MSG(msg)){
		dbg_info("deserialize_msg:error msg:%x",msg[0]);
		return MSG_ERROR_NOT_A_MSG;
	}
        datalen = len-MSG_HEAD_LEN;
	msg_  = (msg_base*)robot_malloc(sizeof(msg),true);
	msg_->data = robot_malloc(datalen+1,true);
	msg_->type = GET_MSG_TYPE(msg);
	msg_->len = GET_MSG_LEN(msg);
	memcpy(msg_->data,msg+MSG_HEAD_LEN,datalen);
	*out_msg = msg_;
	return 0;
}
